﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data.EntityModel;
using SMG.Presentation.Generics;

namespace SMG.Presentation
{
    /// <summary>
    /// Interaction logic for WConfig.xaml
    /// </summary>
    public partial class WConfig : Window, IWindowCrud
    {
        #region Constructors
        public WConfig()
        {
            InitializeComponent();
            lstButton.Add(this.btnAlterar);
            lstButton.Add(this.btnCancelar);
            lstButton.Add(this.btnSair);
            lstButton.Add(this.btnSalvar);
        }
        #endregion

        #region Attributes
        Config entidade;
        List<Button> lstButton = new List<Button>();
        #endregion

        #region IWindowCrud Members

        public void btnAlterar_Click(object sender, RoutedEventArgs e)
        {
            this.gridForm.IsEnabled = true;
            CrudButtonResolver.SetStateEditing(lstButton);
        }

        public void btnSalvar_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                this.Validate();

                this.LoadEntity();

                using (Data bd = new Data(Util.getConnectionString()))
                {

                    Config update = bd.Configs.Where(q => q.Codigo.Equals(entidade.Codigo)).First();
                    update.Nome = entidade.Nome;
                    update.Email = entidade.Email;
                    update.CodigoServidor = entidade.CodigoServidor;
                    update.Senha = entidade.Senha;

                    bd.SubmitChanges();

                    MessageBox.Show("Configuração alterada com sucesso.");
                }

                this.gridForm.IsEnabled = false;
                CrudButtonResolver.SetStateLoaded(lstButton);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        public void btnCancelar_Click(object sender, RoutedEventArgs e)
        {
            this.Clean();

            this.txtNome.Text = entidade.Nome;
            this.txtEmail.Text = entidade.Email;
            this.txtSenha.Password = entidade.Senha;
            this.cboServidor.SelectedValue = entidade.CodigoServidor;

            CrudButtonResolver.SetStateLoaded(lstButton);
        }

        public void btnSair_Click(object sender, RoutedEventArgs e)
        {
            if (MessageBox.Show("Tem certeza que deseja sair?", "Mail Sender", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
                this.Close();
        }

        public void Clean()
        {
            this.gridForm.IsEnabled = false;
        }

        public void LoadEntity()
        {
            try
            {
                if (entidade == null)
                    entidade = new Config();

                entidade.Nome = this.txtNome.Text;
                entidade.Email = this.txtEmail.Text;
                entidade.Senha = this.txtSenha.Password;
                entidade.CodigoServidor = Int32.Parse(this.cboServidor.SelectedValue.ToString());
            }
            catch (Exception)
            {
                throw;
            }
        }

        public void Validate()
        {
            if (String.IsNullOrEmpty(this.txtNome.Text))
                throw new Exception("Favor preencher o campo Nome.");

            if (String.IsNullOrEmpty(this.txtSenha.Password))
                throw new Exception("Favor preencher o campo Senha.");

            if (!this.txtEmail.Text.Contains("@") || !this.txtEmail.Text.Contains("."))
                throw new Exception("Campo Email está preenchido incorretamente.");

            if (this.cboServidor.SelectedItem == null)
                throw new Exception("Favor preencher o campo Servidor.");
        }

        #endregion

        #region Auxiliars Functions

        protected void CarregaServidores()
        {
            try
            {
                using (Data db = new Data(Util.getConnectionString()))
                {
                    this.cboServidor.ItemsSource = db.Servidors.ToList();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        protected void CarregaConfig()
        {
            try
            {
                using (Data bd = new Data(Util.getConnectionString()))
                {
                    entidade = (from c in bd.Configs
                                select c).First();

                    this.txtNome.Text = entidade.Nome;
                    this.txtEmail.Text = entidade.Email;
                    this.txtSenha.Password = entidade.Senha;
                    this.cboServidor.SelectedValue = entidade.CodigoServidor;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
        #endregion

        #region Window Events

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.CarregaServidores();

            this.CarregaConfig();
        }

        private void txtEmail_LostFocus(object sender, RoutedEventArgs e)
        {
            try
            {
                if (!String.IsNullOrEmpty(this.txtEmail.Text))
                {
                    string nome;
                    nome = this.txtEmail.Text.Substring(this.txtEmail.Text.IndexOf('@') + 1);
                    nome = nome.Substring(0, nome.IndexOf('.'));

                    using (Data db = new Data(Util.getConnectionString()))
                    {
                        int codigo = (from s in db.Servidors
                                      where s.Nome.Contains(nome)
                                      select s.Codigo).ToList().FirstOrDefault();

                        if (codigo != 0)
                            this.cboServidor.SelectedValue = codigo;
                    }
                }
            }
            catch (Exception)
            {
            }
        }
        #endregion

        #region IWindowCrud Members

        public void btnNovo_Click(object sender, RoutedEventArgs e)
        {
            throw new NotImplementedException();
        }

        public void btnConsultar_Click(object sender, RoutedEventArgs e)
        {
            throw new NotImplementedException();
        }

        public void btnExcluir_Click(object sender, RoutedEventArgs e)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}
